<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>发布订阅模式</title>
	</head>
	<body>
		<script type="text/javascript">
			// var ab = {};
			// ab.list = [];

			// 增加订阅者
			// ab.listen = function(key, fn) {
			// 	if (!this.list[key]) {
			// 		this.list[key] = []
			// 	}
			// 	this.list[key].push(fn)
			// }

			// // 发布消息
			// ab.trigger = function() {
			// 	let key = Array.prototype.shift.call(arguments);
			// 	let fns = this.list[key];
			// 	if (!fns || fns.length == 0) {
			// 		return
			// 	}
			// 	let fn = null;
			// 	for (let i = 0; i < fns.length; i++) {
			// 		fn = fns[i];
			// 		fn.apply(this, arguments);
			// 	}
			// }

			// //取消订阅
			// ab.remove = function(key, fn) {
			// 	let fns = ab.list[key];
			// 	if (!fns) {
			// 		return
			// 	}
			// 	if (!fn) {
			// 		fns.length = 0;
			// 		return
			// 	}
			// 	for (let j = fns.length - 1; j >= 0; j--) {
			// 		if (fns[j] === fn) {
			// 			fns.splice(j, 1)
			// 		}
			// 	}
			// }

			// ab.listen('red', function() {
			// 	console.log("颜色是：", arguments[0].color)
			// 	console.log("尺寸是：", arguments[0].size)
			// })

			// ab.listen('black', black = function() {
			// 	console.log("颜色是：", arguments[0].color)
			// 	console.log("尺寸是：", arguments[0].size)
			// })

			// ab.trigger('red', {
			// 	color: "red",
			// 	size: 42
			// });

			// ab.trigger('black', {
			// 	color: "black",
			// 	size: 38
			// });

			// ab.remove('black', black)

			// console.log(ab)

			
			var Event = (function() {
				var list = [],listen, trigger, remove;
				//增加订阅
				listen = function(key, fn) {
					if (!this.list[key]) {
						this.list[key] = []
					}
					this.list[key].push(fn)
				};
				// 发布消息
				trigger = function() {
					let key = Array.prototype.shift.call(arguments);
					let fns = this.list[key];
					if (!fns || fns.length == 0) {
						return
					}
					let fn = null;
					for (let i = 0; i < fns.length; i++) {
						fn = fns[i];
						fn.apply(this, arguments);
					}
				};
				// 取消订阅
				remove = function(key, fn) {
					let fns = ab.list[key];
					if (!fns) {
						return
					}
					if (!fn) {
						fns.length = 0;
						return
					}
					for (let j = fns.length - 1; j >= 0; j--) {
						if (fns[j] === fn) {
							fns.splice(j, 1)
						}
					}
				};
				return {
					listen,
					trigger,
					remove
				}
			})()
		</script>
	</body>
</html>